#ifndef MY_SHELL_LEXICAL_ANALYZER_H
#define MY_SHELL_LEXICAL_ANALYZER_H

#include <vector>
#include <string>
#include <cstdint>
#include <unordered_map>

#include "MyShellNamespace.h"
#include "MyShellWord.h"

MY_SHELL_NAMESPACE_BEGIN
// 词法分析器
class MyShellLexicalAnalyzer
{
private:
    // mysh脚本每一行
    static std::vector<std::string> every_line_of_mysh_script;
    // mysh脚本行数
    static std::size_t line_num;
    // 当前分析到的行的行号
    static std::int32_t line_id;
    // 当前分析的行的长度
    static std::size_t line_size;
    // 当前分析到的行的行内索引
    static std::int32_t index_in_line;
public:
    // 删除所有构造及析构函数
    MyShellLexicalAnalyzer() = delete;
    MyShellLexicalAnalyzer(const mysh::MyShellLexicalAnalyzer& other) = delete;
    MyShellLexicalAnalyzer(mysh::MyShellLexicalAnalyzer&& other) = delete;
    ~MyShellLexicalAnalyzer() = delete;
private:
    // 辅助词法分析的函数
    // 分析命令
    static mysh::Word analyzeCommand();
    // 分析标识符或关键字
    static mysh::Word analyzeIdentifierAndKeyword();
    // 分析数字
    static mysh::Word analyzeInteger();
    // 分析字符串
    static mysh::Word analyzeString();
    // 分析其他单词
    static mysh::Word analyzeSpecialWords();
public:
    // 词法分析入口函数
    static std::vector<mysh::Word> analyze(const std::vector<std::string>& every_line_of_mysh_script, bool if_print_error = false);
private:
    // 供内部使用的打印函数
    // 打印错误信息
    static void printError(const mysh::Word& word, const std::int32_t& line_id, const std::int32_t& index_in_line);
public:
    // 外部可用其它接口
    // 打印词法分析所有信息
    static void printAnalyzeMessage(const std::vector<mysh::Word>& all_words);
};
MY_SHELL_NAMESPACE_END

#endif // ! MY_SHELL_LEXICAL_ANALYZER_H